﻿using System;
using System.Collections.Generic;
using System.Data;
using PagedList;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using EventPlanner.Models;
using EventPlanner.Authorization;

namespace EventPlanner.Controllers
{
    public class OrganizadorController : Controller
    {
        private DropCreateDatabaseIfModelChanges<EventPlannerContext> c = new DropCreateDatabaseIfModelChanges<EventPlannerContext>();
        private readonly IEventPlannerContext _db;

        public OrganizadorController(IEventPlannerContext db) { _db = db; }
        //
        // GET: /Organizador/
        [Authorize(Roles="Publisher")]
        [AutorizarCreadorOrganizador]
        public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
        {
            string usuarioActual = _db.GetUsuarioActual();

            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name desc" : "";           
            if (Request.HttpMethod == "GET")
            {
                searchString = currentFilter;
            }

            ViewBag.CurrentFilter = searchString;

            var organizadores = from s in _db.Organizador
                                where s.Creador == usuarioActual
                                select s;


            if (!String.IsNullOrEmpty(searchString))
            {
                organizadores = from s in organizadores
                                where (s.Nombre.ToUpper().Contains(searchString.ToUpper())
                                             || s.Creador.ToUpper().Contains(searchString.ToUpper()))


                                select s;
            }

            ViewBag.NameAddOn  = "";
            switch (sortOrder)
            {
                case "Name desc":
                    organizadores = organizadores.OrderByDescending(s => s.Nombre);
                    ViewBag.NameAddOn = "\u2193";
                    break;
               


                default:
                    organizadores = organizadores.OrderBy(s => s.Nombre);
                    ViewBag.NameAddOn = "\u2191";
                    break;
            }

            int pageSize = 10;
            int pageNumber = (page ?? 1);


            return View(organizadores.ToPagedList(pageNumber, pageSize));
        }

        public ActionResult TodosLosOrganizadores(string sortOrder, string currentFilter, string searchString, int? page)
        {          

            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name desc" : "";
            ViewBag.CreatorSortParm = sortOrder == "Creator" ? "Creator desc" : "Creator";
            ViewBag.StateSortParm = sortOrder == "State" ? "State desc" : "State";


            if (Request.HttpMethod == "GET")
            {
                searchString = currentFilter;
            }

            ViewBag.CurrentFilter = searchString;

            var organizadores = from s in _db.Organizador
                          select s;


            if (!String.IsNullOrEmpty(searchString))
            {
                organizadores = from s in organizadores
                        where (s.Nombre.ToUpper().Contains(searchString.ToUpper())
                                     || s.Creador.ToUpper().Contains(searchString.ToUpper()))
                                      

                        select s;
            }

            ViewBag.NameAddOn = ViewBag.SateAddOn = ViewBag.CreatorAddOn = "";
            switch (sortOrder)
            {
                case "Name desc":
                    organizadores = organizadores.OrderByDescending(s => s.Nombre);
                    ViewBag.NameAddOn = "\u2193";
                    break;
                case "Creator":
                    organizadores = organizadores.OrderBy(s => s.Creador);
                    ViewBag.DateAddOn = "\u2191";
                    break;
                case "Creator desc":
                    organizadores = organizadores.OrderByDescending(s => s.Creador);
                    ViewBag.DateAddOn = "\u2193";
                    break;

                case "State":
                    organizadores = organizadores.OrderBy(s => s.Activa);
                    ViewBag.DateAddOn = "\u2191";
                    break;
                case "State desc":
                    organizadores = organizadores.OrderByDescending(s => s.Activa);
                    ViewBag.DateAddOn = "\u2193";
                    break;


                default:
                    organizadores = organizadores.OrderBy(s => s.Nombre);
                    ViewBag.NameAddOn = "\u2191";
                    break;
            }

            int pageSize = 10;
            int pageNumber = (page ?? 1);


            return View("Administrator/Index",organizadores.ToPagedList(pageNumber, pageSize));
            
        }
        
        //
        // GET: /Organizador/Create
        [Authorize(Roles = "Publisher")]
        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Organizador/Create
        [Authorize(Roles = "Publisher")]
        [HttpPost]
        public ActionResult Create(Organizador organizador)
        {
            string usuarioActual = _db.GetUsuarioActual();

            if (ModelState.IsValid)
            {
                if (_db.Organizador.Any(o => o.Nombre == organizador.Nombre && o.Creador == usuarioActual)) 
                    return RedirectToAction("CustomError", "Error", new { MensajeError = "Ya existe un organizador con ese nombre." });
                else
                {
                    organizador.Creador = usuarioActual;
                    organizador.Activa = true;
                    _db.Organizador.Add(organizador);

                    _db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            return View(organizador);
        }

       

        //
        // GET: /Organizador/Edit/5
        [Authorize(Roles = "Publisher,Administrator")]
        [AutorizarCreadorOrganizador]
        public ActionResult Edit(int id)
        {                                 
            var organizador = _db.GetOrganizador(id);
            if (organizador.IsValid()) // existe
                return View(organizador);
            else
                return RedirectToAction("CustomError", "Error", new { MensajeError = "No existe el organizador" });                                                                            
        }

        //
        // POST: /Organizador/Edit/5
        [Authorize(Roles = "Publisher,Administrator")]
        [HttpPost]
        public ActionResult Edit(int id, Organizador organizador)
        {
            if (ModelState.IsValid)
            {
                    var org = (from m in _db.Organizador
                                where (m.Nombre == organizador.Nombre && m.Creador ==organizador.Creador)
                                select m).FirstOrDefault();

                    if (org == null) //no existe un registro anterior con el nuevo nombre
                    {
                      
                        _db.SetModified(organizador);
                        
                        organizador.Activa = true;
                        _db.SaveChanges();
                    }
                    else //ya existe el registro
                    {
                        return RedirectToAction("CustomError", "Error", new { MensajeError = "Ya existe un organizador con ese nombre." });
                    }                                       
            }
            if (EventPlanner.Authorization.util.UserIsAdmin(_db.GetUsuarioActual())) return RedirectToAction("TodosLosOrganizadores");                
                return RedirectToAction("Index");                
        }

        //
        // GET: /Organizador/Delete/5
        [Authorize(Roles = "Publisher,Administrator")]
        [AutorizarCreadorOrganizador]
        public ActionResult Delete(int id)
        {
            Organizador organizador = _db.GetOrganizador(id);
            if (organizador.IsValid())
                return View(organizador);                    
            else
                return RedirectToAction("index");            
        }          

        //
        // POST: /Organizador/Delete/5
        [Authorize(Roles = "Publisher,Administrator")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Organizador organizador = _db.GetOrganizador(id);
            if (organizador.IsValid())
            {
                _db.Organizador.Remove(organizador);
                _db.SaveChanges();
                if (EventPlanner.Authorization.util.UserIsAdmin(_db.GetUsuarioActual())) return RedirectToAction("TodosLosOrganizadores");                
                return RedirectToAction("Index");
            }
            return RedirectToAction("CustomError", "Error", new { MensajeError = "No existe el organizador!" });
        }
 
        [Authorize(Roles = "Administrator")]
        public ActionResult Deactivate(int id)
        {
            if (ModelState.IsValid)
            {
                var newOrg = _db.GetOrganizador(id);
                if (newOrg.IsValid())
                {
                    newOrg.Activa = false;
                    _db.SaveChanges();
                    return RedirectToAction("TodosLosOrganizadores");
                }
                else
                    return RedirectToAction("CustomError", "Error", new { MensajeError = "No existe el organizador!" });
            }
            return RedirectToAction("TodosLosOrganizadores");
        }

       [Authorize(Roles = "Administrator")]
       public ActionResult Activate(int id)
        {
            if (ModelState.IsValid)
            {
                var newOrg = _db.GetOrganizador(id);
                if (newOrg.IsValid())
                {
                    newOrg.Activa = true;
                    _db.SaveChanges();
                    return RedirectToAction("TodosLosOrganizadores");
                }
                else
                    return RedirectToAction("CustomError", "Error", new { MensajeError = "No existe el organizador!" });
            }
            return RedirectToAction("TodosLosOrganizadores");
        }

    } // OrganizadorController 
} 
